package FINAL.find_monitors;

import java.util.Random;

import FINAL.CONSTANT;
import FINAL.Read_file_to_matrix;
import FINAL.find_rumors.Calculaotr_distance;

public class Inter_monitor_distance {
	public static void main(String[] args) {
//		int[] rd_list = new int[CONSTANT.SIZE];
//		for (int i = 0; i < CONSTANT.SIZE; i++) {
//			rd_list[i] = i;
//		}
//		shuffleArray(rd_list);

//		int[] dis = InterMonitorDistance(5, 5,
//				Read_file_to_matrix.read_file_to_matrix());
//		for (int i = 0; i < dis.length; i++) {
//			System.out.println("Dis: " + dis[i]);
//		}
	}

	/**
	 * 
	 * @param k
	 *            số lượng monitor cần tìm
	 * @param d
	 *            số bước nháy tối thiểu
	 * @param list
	 *            ma trận biểu diễn đồ thị
	 * @param list_rd
	 *            mảng id được xáo trộn, ngẫu nhiên hoặc chủ ý
	 * @return trả về mảng k monitor cần tìm, nếu ko đủ thì những giá trị thiếu
	 *         sẽ có giá trị -1
	 */
	public static int[] InterMonitorDistance(int k, int d, int[][] list, int[] list_rd) {
//		int[] list_rd = new int[CONSTANT.SIZE];
//		for (int i = 0; i < CONSTANT.SIZE; i++) {
//			list_rd[i] = i;
//		}
//		shuffleArray(list_rd);

		int[] ketqua = new int[k];
		int index = 0;

		ketqua[index] = list_rd[0];
		list_rd[0] = -1;
		index++;

		while (index < k && !fullValue(-1, list_rd)) {
			for (int i = 0; i < list_rd.length; i++) {
				if (list_rd[i] != -1) {
					boolean check = true;
					for (int j = 0; j < index; j++) {
						if (Calculaotr_distance.kc_giua_hai_node(list_rd[i],
								list, ketqua[j]) < d) {
							check = false;
							list_rd[i] = -1;
							break;
						}
					}
					if (check == true) {
						ketqua[index] = list_rd[i];
						list_rd[i] = -1;
						index++;
						if (index == k) {
							break;
						}
					}
				}
			}
		}
		return ketqua;
	}

	/**
	 * 
	 * @param x
	 *            giá trị cần kiểm tra
	 * @param list
	 *            list cần kiểm tra
	 * @return kiểm tra xem toàn bộ các phần tử của list có bằng x hay không
	 */
	public static boolean fullValue(int x, int[] list) {
		for (int i = 0; i < list.length; i++) {
			if (list[i] != x) {
				return false;
			}
		}
		return true;
	}

	public static void shuffleArray(int[] ar) {
		Random rnd = new Random();
		for (int i = ar.length - 1; i > 0; i--) {
			int index = rnd.nextInt(i + 1);
			// Simple swap
			int a = ar[index];
			ar[index] = ar[i];
			ar[i] = a;
		}
	}
}
